home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / geost / geost.bas < prev    next >
BASIC Source File  |  1992-06-01  |  19KB  |  311 lines

  1. 10 'GEOST.BAS Ver 1.2, Padova, June2, 1992
  2. 20 'written by Giuliano Artico, I3LGP, Via Venezia 4, 30022 Ceggia (VE), Italy
  3. 30 'Calculation of azimut and elevation of geo-stationary satellites
  4. 40 'The evaluation is made on three pilot satellites seen by the observer
  5. 50 '(western, central, eastern) whose longitude may be supplied in two different ways:
  6. 60 '1) by editing the appropriate lines in the configuration file GEOST.DAT
  7. 70 '2) by entering the proper option on the command line at the DOS prompt
  8. 80 'The option /? provides a summary of the valid options
  9. 90 'Valid options are:
  10. 100 '/Q (QTH locator), /W (western), /C (central), /E (eastern)
  11. 110 '/I (increment), /H (horizontal), /V (vertical), /L (page length)
  12. 120 'Default information are listed at lines 2510-2530
  13. 130 'Arrows and N,S,E,W keys allow small and big shift of the observer position
  14. 140 'Alt-F1 ... Alt-F6 modify the pilot satellites longitude
  15. 150 'Alt-F7 and Alt-F8 modify the printed page length
  16. 160 'H, V and I keys set the parameters for the printed table
  17. 170 'The following keys provide output of stored locations or of region data:
  18. 180 'on file: L and R keys;  on printer: Alt-L and Alt-R
  19. 200 KEY OFF
  20. 210 DIM Q%(6),Q$(6), STLO(10),STLA(10),STO$(10), CH%(6), TH(3), QTF(3),ZE(3), PIL%(3)
  21. 220 P=3.1415926536#: P2=P/2: DR=P/180: RD=180/P: PINC=P/1800
  22. 230 R=6371.001
  23. 240 CO$="####.##  ####.##": FO$="####.#   ####.#"
  24. 250 DEF FNVP1(X1,X2,X3,Y1,Y2,Y3)=X2*Y3-X3*Y2: 'Vector product
  25. 260 DEF FNVP2(X1,X2,X3,Y1,Y2,Y3)=X3*Y1-X1*Y3
  26. 270 DEF FNVP3(X1,X2,X3,Y1,Y2,Y3)=X1*Y2-X2*Y1
  27. 280 DEF FNIP(X1,X2,X3,Y1,Y2,Y3)=X1*Y1+X2*Y2+X3*Y3: 'Inner product
  28. 500 'Start
  29. 510 CY%=2: GOSUB 2000: RH=R+H: RH2=RH^2: GOSUB 1200
  30. 520 IF E%>0 THEN PRINT "An error occurred reading default information": BEEP: GOTO 900
  31. 530 IF FLAG%=0 THEN GOSUB 3000: MTH=TH: MPH=PH: GOSUB 1020: IF AR%=0 THEN GOSUB 1090
  32. 540 GOSUB 15000
  33. 550 LOCATE CY%+1,LL%: PRINT Q$
  34. 560 LOCATE ,LL%: PRINT USING CO$; MPH*RD,MTH*RD
  35. 570 FOR I%=1 TO 3: LOCATE ,LL%: PRINT USING FO$; QTF(I%),ZE(I%): NEXT
  36. 600 LOCATE ,LL%: PRINT USING " ###.#   ####.##"; ELEV,CORR
  37. 610 GOSUB 8000: GOTO 530
  38. 900 IF STO% THEN GOSUB 12000
  39. 910 ON ERROR GOTO 0: LOCATE 23,1: END
  40. 1000 'Small Routines
  41. 1010 'Cartesian from polar co-ordinates
  42. 1011 X1=COS(PH)*COS(TH): X2=COS(PH)*SIN(TH): X3=SIN(PH): RETURN
  43. 1020 LOCATE 25,1:PRINT SPACE$(79);:LOCATE ,1,1:RETURN: 'Clear line 25
  44. 1030 TH=DR*(DLO%+PLO/60): PH=DR*(DLA%+PLA/60): RETURN
  45. 1040 'ACOS
  46. 1041 U%=0: IF X>=1-7E-08 THEN U%=1: X=0: RETURN
  47. 1042 IF X<=-1+7E-08 THEN U%=1: X=P: RETURN
  48. 1043 X=P2-ATN(X/SQR(1-X^2)): RETURN
  49. 1050 GOSUB 1070: A%=INSTR(X$," "): B%=INSTR(X$,"="): IF B%>A% THEN A%=B%
  50. 1051 B%=INSTR(X$,A$): IF B% THEN X$=MID$(X$,A%+1): GOSUB 1060: X=VAL(X$): RETURN ELSE RETURN
  51. 1060 IF RIGHT$(X$,1)=" " THEN X$=LEFT$(X$,LEN(X$)-1): GOTO 1060
  52. 1061 IF LEFT$(X$,1)=" " THEN X$=MID$(X$,2): GOTO 1061 ELSE RETURN
  53. 1070 FOR I%=1 TO LEN(X$): Z$=MID$(X$,I%,1): IF Z$>="a" AND Z$<="z" THEN MID$(X$,I%,1)=CHR$(ASC(Z$)-32)
  54. 1071 NEXT: RETURN
  55. 1080 X$=MID$(A$,A%+2): Y$=LEFT$(X$,1): IF Y$="." OR Y$="-" OR Y$="+" OR Y$>="0" AND Y$<="9" THEN X=VAL(X$): RETURN ELSE X=1000: RETURN
  56. 1090 LOCATE PA%-1,1: PRINT "Output parameters:": GOSUB 1130: GOSUB 1140: GOSUB 1150: GOSUB 1160: GOSUB 1170: GOSUB 1180
  57. 1091 AR%=1: LOCATE 15,1: PRINT "Stored locations:": FOR A%=1 TO 10: GOSUB 1100: NEXT
  58. 1092 COLOR 6: LOCATE PA%+6,1: PRINT "ArrowKeys=Small shift    N/S/E/W=Shift one square to N/S/E/W    Q=New location"
  59. 1093 PRINT "F1 ... F10=Retrieve stored location    Ctrl-F1 ... Ctrl-F10=Store shown location"
  60. 1094 PRINT "Set satell.:  Alt-F1/Alt-F2=Western Alt-F3/Alt-F4=Central Alt-F5/Alt-F6=Eastern"
  61. 1095 PRINT "I=Increment    H/V=Region's H-size/V-size    Alt-F7/Alt-F8=PageLength"
  62. 1096 PRINT "F=Output to log file   P=Output to printer": COLOR 7: RETURN
  63. 1100 LOCATE PA%+3+INT(A%/6),1+16*((A%-1) MOD 5): PRINT "F" MID$(STR$(A%),2) "=" STO$(A%): RETURN
  64. 1110 GOSUB 1020: SOUND BE%,1: IF FI%=0 THEN PRINT "Printer not ready!"; ELSE PRINT "Error opening output file!";
  65. 1111 PRINT " Retry? (Y/N)  Y ";: LOCATE ,POS(0)-2,1
  66. 1112 A$=INKEY$: IF A$="" THEN 1112 ELSE GOSUB 1020: IF A$=CHR$(27) THEN 900 ELSE RETURN
  67. 1120 PRINT #2, "Position of geo-stationary satellites - Output on date: " DATE$
  68. 1121 PRINT #2,: PRINT #2, USING PILOT$; TH(1)*RD, TH(2)*RD, TH(3)*RD: PRINT #2,: PRINT #2,H1$: PRINT #2,H2$: PRI%=1: N0%=6: RETURN
  69. 1130 LOCATE PA%,1: PRINT USING "Increment=##"; INC%: RETURN
  70. 1140 LOCATE PA%,16: PRINT USING "H-size=##"; HN%: RETURN
  71. 1150 LOCATE PA%,28: PRINT USING "V-size=##"; VN%: RETURN
  72. 1160 LOCATE PA%,40: PRINT USING "Total=### "; HN%*VN%: RETURN
  73. 1170 LOCATE PA%,52: PRINT USING "PageLength=### "; NLINES%: RETURN
  74. 1180 LOCATE PA%,69: PRINT "File=" MID$(STR$(LDF),2);: RETURN
  75. 1190 ON ERROR GOTO 1191: CLOSE 2: OPEN "A",2,OLF$: IF LDF=0 THEN PRINT #2,IDOLF$: RETURN ELSE RETURN
  76. 1191 RESUME 1192
  77. 1192 OLF%=1: RETURN
  78. 1200 LOCATE 10,1: PRINT USING PILOT$; TH(1)*RD, TH(2)*RD, TH(3)*RD: RETURN
  79. 1210 LOCATE 10,PIL%(I%): PRINT USING "####.#";TH(I%)*RD: PH=MPH: RETURN
  80. 1300 DLO%=FIX(X1/60): PLO=X1-DLO%*60: DLA%=FIX(Y1/60): PLA=Y1-DLA%*60: RETURN
  81. 2000 'Configuration
  82. 2010 READ TIT$: IF INSTR(COMMAND$,"?") THEN 11000
  83. 2020 BE%=800: BE1%=5000: MAXN%=21: PA%=13: FOR I%=1 TO 6: READ CH%(I%): NEXT: FOR I%=1 TO 3: READ PIL%(I%): NEXT: FOR I%=1 TO 10: KEY I%,"": STLO(I%)=32767: NEXT
  84. 2030 FOR I%=1 TO 10: CTR0$=CTR0$+CHR$(47+I%): NEXT: CTR1$=CTR0$: FOR I%=1 TO 24: CTR1$=CTR1$+CHR$(64+I%): NEXT
  85. 2040 CLS: PRINT TIT$: FOR I%=1 TO 6: READ A$: A%=LEN(A$)+3: IF A%>LL% THEN LL%=A%
  86. 2050 LOCATE CY%+I%,1: PRINT A$: NEXT: READ CFG$,IDCFG$, STO$,IDSTO$, OLF$,IDOLF$
  87. 2060 ON ERROR GOTO 2120: RESTORE 2490: READ H
  88. 2070 FOR I%=1 TO 3: READ DLO%,PLO,L$: IF ABS(DLO%)>180 OR ABS(PLO)>59.5 THEN E%=1: RETURN
  89. 2080 IF L$="w" OR L$="W" THEN DLO%=-DLO%: PLO=-PLO
  90. 2090 TH(I%)=DR*(DLO%+PLO/60): NEXT I%
  91. 2100 READ INC%,HN%,VN%,NLINES%
  92. 2110 GOTO 2130
  93. 2120 E%=1: RESUME 2130
  94. 2130 ON ERROR GOTO 2240: OPEN "I",1,CFG$: LINE INPUT #1, X$: IF INSTR(X$,IDCFG$)=0 THEN 2250
  95. 2140 E%=0: WHILE EOF(1)=0: LINE INPUT #1, X$: A%=INSTR(X$,"#"): IF A% THEN X$=LEFT$(X$,A%-1)
  96. 2150 GOSUB 1070: A$="QTH-LOCATOR": GOSUB 1050: IF B% THEN Q0$=LEFT$(X$,6): GOTO 2230
  97. 2160 A$="WESTERNSAT": GOSUB 1050: IF B% AND ABS(X)<=180 THEN TH(1)=X*DR: GOTO 2230
  98. 2170 A$="CENTRALSAT": GOSUB 1050: IF B% AND ABS(X)<=180 THEN TH(2)=X*DR: GOTO 2230
  99. 2180 A$="EASTERNSAT": GOSUB 1050: IF B% AND ABS(X)<=180 THEN TH(3)=X*DR
  100. 2190 A$="INCREMENT": GOSUB 1050: IF B% AND X>=1 AND X<=60 THEN INC%=X
  101. 2200 A$="HORIZONTAL": GOSUB 1050: IF B% AND X>=1 AND X<=MAXN% THEN HN%=X
  102. 2210 A$="VERTICAL": GOSUB 1050: IF B% AND X>=1 AND X<=MAXN% THEN VN%=X
  103. 2220 A$="PAGELENGTH": GOSUB 1050: IF B% AND X>=1 AND X<=999 THEN NLINES%=X
  104. 2230 WEND: GOTO 2250
  105. 2240 RESUME 2250
  106. 2250 X$=COMMAND$: GOSUB 1060: IF X$="" THEN 2340
  107. 2260 A$=X$: A%=INSTR(A$,"/Q"): IF A% THEN Q0$=MID$(A$,A%+2,6)
  108. 2270 A%=INSTR(A$,"/W"): IF A% THEN GOSUB 1080: IF ABS(X)<=180 THEN TH(1)=X*DR
  109. 2280 A%=INSTR(A$,"/C"): IF A% THEN GOSUB 1080: IF ABS(X)<=180 THEN TH(2)=X*DR
  110. 2290 A%=INSTR(A$,"/E"): IF A% THEN GOSUB 1080: IF ABS(X)<=180 THEN TH(3)=X*DR
  111. 2300 A%=INSTR(A$,"/I"): IF A% THEN GOSUB 1080: IF X>=1 AND X<=60 THEN INC%=X
  112. 2310 A%=INSTR(A$,"/H"): IF A% THEN GOSUB 1080: IF X>=1 AND X<=MAXN% THEN HN%=X
  113. 2320 A%=INSTR(A$,"/V"): IF A% THEN GOSUB 1080: IF X>=1 AND X<=MAXN% THEN VN%=X
  114. 2330 A%=INSTR(A$,"/L"): IF A% THEN GOSUB 1080: IF X>=1 AND X<=999 THEN NLINES%=X
  115. 2340 ON ERROR GOTO 2380: CLOSE 1: OPEN "I",1,STO$: LINE INPUT #1,X$: IF INSTR(X$,IDSTO$)=0 THEN 2390
  116. 2350 CLOSE 1: OPEN "R",1,STO$,8: FIELD 1,8 AS BUF$
  117. 2360 FOR H%=1 TO 10: GET 1,6+H%: X1=CVS(LEFT$(BUF$,4)): Y1=CVS(MID$(BUF$,5,4)): IF ABS(X1)<=10800 AND ABS(Y1)<=5399.5 THEN STLO(H%)=X1: STLA(H%)=Y1: GOSUB 1300: GOSUB 7000: STO$(H%)=Q$
  118. 2370 NEXT: GOTO 2390
  119. 2380 RESUME 2390
  120. 2390 ON ERROR GOTO 2392: CLOSE: OPEN "I",1,OLF$: LDF=LOF(1): LINE INPUT #1,A$: IF INSTR(A$,IDOLF$)=0 THEN OLF%=1
  121. 2391 CLOSE: GOTO 2399
  122. 2392 IF ERR<>53 THEN OLF%=1
  123. 2395 RESUME 2399
  124. 2399 RESTORE 2560: READ PILOT$,H1$,H2$,FORM$: ON ERROR GOTO 0
  125. 2400 HN%=1+2*INT(HN%/2): VN%=1+2*INT(VN%/2): RETURN
  126. 2410 DATA "GEOST 1.2, Geo-Stationary Satellites' position, 1992, Giuliano Artico I3LGP"
  127. 2420 DATA 17, 17, 9, 9, 23, 23
  128. 2425 DATA 39,56,73
  129. 2430 DATA "Observer's QTH locator"
  130. 2440 DATA "Observer's Lat/Long"
  131. 2450 DATA "Western satellite's Az/El", "Central satellite's Az/El", "Eastern satellite's Az/El"
  132. 2460 DATA "Peaking elevation / Correction"
  133. 2470 DATA "GEOST.DAT", "GEOST.DAT - Configuration file", "GEOST.SAT", "GEOST.SAT - Locator store file", "GEOST.LOG","GEOST.LOG - Output file"
  134. 2480 'Enter information about satellites here
  135. 2490 DATA 35863: 'Distance of satellites from the earth surface
  136. 2500 'Format of the next data lines: deg, pr, East/West (pr may be decimal)
  137. 2510 DATA 27, 30, "W": 'Western satellite's longitude
  138. 2520 DATA 13, 0, "E": 'Central satellite's longitude
  139. 2530 DATA 23, 30, "E": 'Eastern satellite's longitude
  140. 2540 'Default parameters for printed table: step (in minutes), h-size, v-size (in steps), number of printed lines
  141. 2550 DATA 15, 9, 5, 63
  142. 2560 'Headings for printout
  143. 2570 DATA "Pilot satellites longitude:   Western=####.#   Central=####.#   Eastern=####.#"
  144. 2580 DATA "  LOC       LAT/LONG       WESTERN       CENTRAL       EASTERN      ELEV/CORR"
  145. 2590 DATA " ------  --------------  ------------  ------------  ------------  -----------"
  146. 2600 DATA "###.## ####.##  ####.# ###.#  ####.# ###.#  ####.# ###.#  ##.# ####.#"
  147. 3000 'Data input
  148. 3010 IF LEN(Q0$)=6 THEN X$=Q0$: GOSUB 5000: IF E%<2 THEN FLAG%=1: Q$=Q0$: Q0$="": RETURN
  149. 3020 GOSUB 1020
  150. 3030 PRINT "Enter the observer's QTH locator (<Return> if unknown) ";
  151. 3040 CTR$=CTR1$: N$="": COL%=POS(0): LE%=6: TP%=2: GOSUB 9000: IF LEN(X$)=6 THEN GOSUB 1070: GOSUB 5000 ELSE 3060
  152. 3050 IF E%=2 THEN BEEP: GOTO 3020 ELSE Q$=X$: RETURN
  153. 3060 IF X$<>"" THEN BEEP
  154. 3070 GOSUB 4000: GOSUB 7000
  155. 3080 TH=DR*(DLO%+PLO/60): PH=DR*(DLA%+PLA/60)
  156. 3090 RETURN
  157. 4000 'Latitude and longitude input
  158. 4010 DLA%=90: PLA=60: DLO%=181: PLO=60
  159. 4020 GOSUB 1020: PRINT "Latitude:   Degrees" TAB(27)"Minutes" TAB(41)"N/S ";
  160. 4030 CTR$=CTR0$: N$="": COL%=21: LE%=2: GOSUB 9000: IF (X$="" OR B$="M") AND DLA%<90 THEN 4050
  161. 4040 IF B%>89 THEN 4030 ELSE DLA%=B%
  162. 4050 LOCATE ,COL%-1: PRINT DLA% "  ";
  163. 4060 CTR$=CTR0$: N$="": COL%=35: LE%=2: GOSUB 9000: IF B$="K" THEN 4030 ELSE IF (X$="" OR B$="M") AND PLA<60 THEN 4080
  164. 4070 IF B%>59 THEN 4060 ELSE PLA=B%
  165. 4080 LOCATE ,COL%-1: PRINT PLA "  ";
  166. 4090 CTR$="NnSs": N$="N ": COL%=45: LE%=1: GOSUB 9000
  167. 4100 IF B$="K" THEN 4060 ELSE IF B$="M" THEN 4090
  168. 4110 IF X$="S" THEN DLA%=-DLA%: PLA=-PLA
  169. 4120 GOSUB 1020: PRINT "Longitude:  Degrees" TAB(27)"Minutes" TAB(41)"E/W ";
  170. 4130 CTR$=CTR0$: N$="": COL%=21: LE%=3: GOSUB 9000: IF (X$="" OR B$="M") AND DLO%<181 THEN 4150
  171. 4140 IF B%>180 THEN 4130 ELSE DLO%=B%
  172. 4150 LOCATE ,COL%-1: PRINT DLO% "  ";
  173. 4160 CTR$=CTR0$: N$="": COL%=35: LE%=2: GOSUB 9000: IF B$="K" THEN 4130 ELSE IF (X$="" OR B$="M") AND PLO<60 THEN 4180
  174. 4170 IF B%>59 THEN 4160 ELSE PLO=B%
  175. 4180 LOCATE ,COL%-1: PRINT PLO "  ";
  176. 4190 CTR$="EeWw": N$="E ": COL%=45: LE%=1: GOSUB 9000
  177. 4200 IF B$="K" THEN 4160 ELSE IF B$="M" THEN 4190
  178. 4210 IF X$="W" THEN DLO%=-DLO%: PLO=-PLO
  179. 4220 RETURN
  180. 5000 'Extracting co-ordinates from the WW QTH locator
  181. 5010 E%=0: IF LEN(X$)<>6 THEN E%=2: RETURN
  182. 5020 FOR I%=1 TO 6: Q$(I%)=MID$(X$,I%,1): Q%=ASC(Q$(I%))
  183. 5030 IF I%=3 OR I%=4 THEN Q%(I%)=Q%-48 ELSE Q%(I%)=Q%-65
  184. 5040 IF Q%(I%)<0 OR Q%(I%)>CH%(I%) THEN E%=2: RETURN
  185. 5050 NEXT I%
  186. 5060 PLO=Q%(5)*5+2.5: I%=INT(PLO/60): DLO%=2*(10*(Q%(1)-9)+Q%(3))+I%: PLO=PLO-I%*60
  187. 5070 DLA%=10*(Q%(2)-9)+Q%(4): PLA=(Q%(6)+.5)*2.5
  188. 5080 IF DLO%<0 THEN DLO%=DLO%+1: PLO=PLO-60
  189. 5090 IF DLA%<0 THEN DLA%=DLA%+1: PLA=PLA-60
  190. 5100 GOSUB 1030: RETURN
  191. 6000 'Estimating QTF
  192. 6010 C1=FNVP1(A1,A2,A3,X1,X2,X3)
  193. 6020 C2=FNVP2(A1,A2,A3,X1,X2,X3)
  194. 6030 C3=FNVP3(A1,A2,A3,X1,X2,X3)
  195. 6040 D1=FNVP1(C1,C2,C3,A1,A2,A3)
  196. 6050 D2=FNVP2(C1,C2,C3,A1,A2,A3)
  197. 6060 D3=FNVP3(C1,C2,C3,A1,A2,A3)
  198. 6070 X=FNIP(N1,N2,N3,D1,D2,D3)/SQR(D1^2+D2^2+D3^2)
  199. 6080 GOSUB 1040: RETURN
  200. 7000 'Determining the WW QTH locator
  201. 7010 I1%=DLO%+180: I2=PLO: I3%=DLA%+90: I4=PLA
  202. 7020 IF I2<0 THEN I1%=I1%-1: I2=60+I2
  203. 7030 IF I4<0 THEN I3%=I3%-1: I4=60+I4
  204. 7040 Q$="": IF I1%=-1 THEN I1%=359 ELSE IF I1%=360 THEN I1%=0
  205. 7050 K%=INT(I1%\2): I%=INT(K%\10): J%=INT(I3%\10)
  206. 7060 Q$=Q$+CHR$(I%+65)+CHR$(J%+65)
  207. 7070 Q$=Q$+CHR$(K%-I%*10+48)+CHR$(I3%-J%*10+48)
  208. 7080 I%=INT((I1% MOD 2)*12+I2/5): J%=INT(I4*24/60): Q$=Q$+CHR$(I%+65)+CHR$(J%+65)
  209. 7090 RETURN
  210. 8000 'Keys handling
  211. 8010 Q1$=Q$
  212. 8020 FLAG%=0: LOCATE CY%+1,LL%: FOR I%=1 TO 16: A$=INKEY$: NEXT: X=DLO%*60+PLO: Y=DLA%*60+PLA
  213. 8030 A$=INKEY$: IF A$="" THEN 8030 ELSE IF A$>="a" AND A$<="z" THEN A$=CHR$(ASC(A$)-32)
  214. 8040 SOUND BE1%,.1: B$=MID$(A$,2)
  215. 8050 IF B$="H" AND Y<5397 THEN Y=Y+2.5: GOTO 8280
  216. 8060 IF B$="P" AND Y>-5397 THEN Y=Y-2.5: GOTO 8280
  217. 8070 IF B$="M" THEN X=X+5: IF X>10800 THEN X=X-21600: GOTO 8280 ELSE 8280
  218. 8080 IF B$="K" THEN X=X-5: IF X<-10800 THEN X=X+21600: GOTO 8280 ELSE 8280
  219. 8090 IF A$="N" AND Y<5340 THEN Y=Y+60: GOTO 8280
  220. 8100 IF A$="S" AND Y>-5340 THEN Y=Y-60: GOTO 8280
  221. 8110 IF A$="E" THEN X=X+120: IF X>=10800 THEN X=X-21600: GOTO 8280 ELSE 8280
  222. 8120 IF A$="W" THEN X=X-120: IF X<-10800 THEN X=X+21600: GOTO 8280 ELSE 8280
  223. 8130 FOR I%=1 TO 3: IF B$=CHR$(102+I%*2) THEN TH(I%)=TH(I%)-PINC: GOSUB 1210: FLAG%=1: RETURN
  224. 8140 IF B$=CHR$(103+I%*2) THEN TH(I%)=TH(I%)+PINC: GOSUB 1210: PH=MPH: FLAG%=1: RETURN
  225. 8150 NEXT I%
  226. 8160 IF A$="F" THEN FI%=1: GOSUB 1020: PRINT "Log to file: "; ELSE IF A$="P" THEN FI%=0: GOSUB 1020: PRINT "Print: "; ELSE 8200
  227. 8162 PRINT "1=Stored locations  2=Region centered on the displayed location ";
  228. 8165 X$=INKEY$: IF X$="" THEN 8165 ELSE IF X$=CHR$(27) THEN GOSUB 1020: GOTO 8020 ELSE IF X$="1" THEN GOSUB 13000: GOTO 8020 ELSE IF X$="2" THEN GOSUB 14000: GOTO 8020 ELSE SOUND BE%,1: GOTO 8165
  229. 8200 IF A$="I" THEN INC%=5+(INC% MOD 60): GOSUB 1130: GOTO 8020
  230. 8210 IF A$="H" THEN HN%=(HN%+2) MOD (MAXN%+1): GOSUB 1140: GOSUB 1160: GOTO 8020
  231. 8220 IF A$="V" THEN VN%=(VN%+2) MOD (MAXN%+1): GOSUB 1150: GOSUB 1160: GOTO 8020
  232. 8230 IF B$=CHR$(110) AND NLINES%>1 OR B$=CHR$(111) AND NLINES%<999 THEN NLINES%=NLINES%+(ASC(B$)-110.5)*2: GOSUB 1170: GOTO 8020
  233. 8240 IF B$="" THEN B%=0 ELSE B%=ASC(B$)
  234. 8250 IF B%>93 AND B%<104 THEN A%=B%-93: IF STO$(A%)<>"" AND BB%<>B% THEN PLAY"MBL40O2GEGE": BB%=B%: GOTO 8030 ELSE STO%=1: STLO(A%)=X: STLA(A%)=Y: STO$(A%)=Q$: GOSUB 1100: LOCATE CY%+1,LL%: PLAY"MBL32O3GEC": GOTO 8030
  235. 8260 IF B%>58 AND B%<69 THEN B%=B%-58: IF ABS(STLO(B%))<=10800 THEN FLAG%=1: X1=STLO(B%): Y1=STLA(B%): GOSUB 1300: GOSUB 1030: Q$=STO$(B%): MTH=TH: MPH=PH: RETURN
  236. 8270 IF A$=CHR$(27) THEN 900 ELSE IF A$=CHR$(13) OR A$="Q" THEN RETURN ELSE SOUND BE%,1: GOTO 8030
  237. 8280 FLAG%=1: X1=X: Y1=Y: GOSUB 1300: GOSUB 1030: MPH=PH: MTH=TH: GOSUB 7000: RETURN
  238. 9000 'Enter a string
  239. 9010 B%=0: X$="": LOCATE ,COL%,1: IF N$<>"" THEN PRINT N$;: LOCATE ,COL%,1
  240. 9020 A$=INKEY$: IF A$="" THEN 9020 ELSE A%=ASC(A$): IF A%=27 THEN 900
  241. 9030 I%=LEN(X$): B$=MID$(A$,2): IF I%=0 AND (B$="K" OR B$="M") THEN B%=999: RETURN
  242. 9040 IF I%>0 AND A%=8 THEN LOCATE ,COL%+I%-1: PRINT " ";: LOCATE ,COL%+I%-1,1: X$=LEFT$(X$,I%-1): GOTO 9020
  243. 9050 IF A%=13 OR I%=LE% THEN 9100
  244. 9060 IF A%>96 AND A%<123 THEN A$=CHR$(A%-32)
  245. 9070 IF LEN(A$)>1 OR INSTR(CTR$,A$)=0 THEN SOUND BE%,1: GOTO 9020
  246. 9080 IF I%=0 THEN PRINT SPACE$(LE%);: LOCATE ,COL%,1
  247. 9090 PRINT A$;: X$=X$+A$: GOTO 9020
  248. 9100 SOUND BE1%,.1: B%=VAL(X$): RETURN
  249. 10000 'Elevation
  250. 10010 ALFA=D/R: Y=COS(ALFA)
  251. 10020 X=SQR(RH2+R^2-2*RH*R*Y)
  252. 10030 SA=RH*SIN(ALFA)/X: IF SA>1 THEN SA=1
  253. 10040 IF Y<0 THEN K%=1 ELSE K%=SGN(R/Y-RH)
  254. 10050 X=K%*SQR(1-SA^2): GOSUB 1040: Z0=X*RD-90: IF ABS(Z0)<.05 THEN Z0=0
  255. 10060 RETURN
  256. 11000 'Help
  257. 11010 PRINT TIT$: PRINT
  258. 11020 PRINT "  Syntax:  GEOST [?] [options]"
  259. 11030 PRINT: PRINT "Valid options are:"
  260. 11040 PRINT "  /Qxxxxxx    Observer's QTH Locator"
  261. 11050 PRINT "  /W[-]nnn.n  East longitude of the western satellite"
  262. 11060 PRINT "  /C[-]nnn.n  East longitude of the central satellite"
  263. 11070 PRINT "  /E[-]nnn.n  East longitude of the eastern satellite"
  264. 11080 PRINT "  /Inn        Increment, the grid width for the region printout"
  265. 11090 PRINT "  /Hnn        Number of locations of the region in the longitude sense"
  266. 11100 PRINT "  /Vnn        Number of locations of the region in the latitude sense"
  267. 11110 PRINT "  /Lnnn       Printed page length (in lines)"
  268. 11120 PRINT: PRINT "Permanent data may be stored in the configuration file GEOST.DAT"
  269. 11130 PRINT: PRINT "Address:": PRINT "Dipartimento di Matematica Pura e Applicata, Via Belzoni 7, 35131 Padova, Italy"
  270. 11140 PRINT "Internet=ARTICO@PDMAT1.UNIPD.IT Decnet=38999::ARTICO": END
  271. 12000 'Store selected locators
  272. 12010 ON ERROR GOTO 12060: CLOSE 1: OPEN "R",1,STO$,48: FIELD 1,48 AS BUF$: IF LOF(1)=0 THEN LSET BUF$=IDSTO$+CHR$(26): PUT 1,1
  273. 12020 CLOSE 1: OPEN "R",1,STO$,8: FIELD 1,8 AS BUF$
  274. 12030 FOR I%=1 TO 10: LSET BUF$=MKS$(STLO(I%))+MKS$(STLA(I%)): PUT 1,6+I%: NEXT: CLOSE
  275. 12050 RETURN
  276. 12060 RESUME 12050
  277. 13000 'Output on file or printer of stored locations information
  278. 13010 PRI%=0: ON ERROR GOTO 13080: IF FI%=0 THEN OPEN "O",2,"LPT1:" ELSE GOSUB 1190: IF OLF%<>0 THEN SOUND BE%,1: RETURN
  279. 13020 PRINT #2,: FOR J%=1 TO 10: IF LEN(STO$(J%))<>6 THEN 13050
  280. 13030 IF PRI%=0 THEN GOSUB 1120
  281. 13040 X$=STO$(J%): GOSUB 5000: IF E%<2 THEN MTH=TH: MPH=PH: GOSUB 15000: PRINT #2, " " X$ TAB(10);: PRINT #2, USING FORM$; MPH*RD,MTH*RD, QTF(1),ZE(1), QTF(2),ZE(2), QTF(3),ZE(3), ELEV,CORR
  282. 13050 NEXT
  283. 13060 IF FI%=1 THEN LDF=LOF(2): GOSUB 1180
  284. 13070 X$=Q1$: GOSUB 5000: MTH=TH: MPH=PH: RETURN
  285. 13080 EE=ERR: RESUME 13090
  286. 13090 GOSUB 1110: IF A$="n" OR A$="N" THEN RETURN ELSE 13000
  287. 14000 'Output on printer or file of region data
  288. 14010 PRI%=0: X0=X: VV%=VN%: YY=Y+INT(VN%/2)*INC%
  289. 14020 WHILE YY>5399: YY=YY-INC%: VV%=VV%-1: WEND
  290. 14030 ON ERROR GOTO 14140: IF FI%=0 THEN OPEN "O",2,"LPT1:" ELSE GOSUB 1190: IF OLF%<>0 THEN SOUND BE%,1: RETURN
  291. 14040 GOSUB 1020: PRINT "Please wait... ";: PRINT #2,: FOR V%=1 TO VV%: XX=X0-INT(HN%/2)*INC%
  292. 14050 FOR H%=1 TO HN%: IF PRI%=0 THEN GOSUB 1120
  293. 14060 IF XX>=10800 THEN XX=XX-21600 ELSE IF XX<-10800 THEN XX=XX+21600 
  294. 14070 DLO%=FIX(XX/60): PLO=XX-DLO%*60: DLA%=FIX(YY/60): PLA=YY-DLA%*60: GOSUB 1030: MPH=PH: MTH=TH: GOSUB 7000: X$=Q$: GOSUB 15000: IF H%=1 THEN PRINT #2,"*"; ELSE PRINT #2," ";
  295. 14080 PRINT #2,X$ TAB(10);: PRINT #2, USING FORM$; MPH*RD,MTH*RD, QTF(1),ZE(1), QTF(2),ZE(2), QTF(3),ZE(3), ELEV,CORR
  296. 14090 N0%=(N0%+1) MOD NLINES%: IF N0%=0 THEN PRINT #2,CHR$(12): PRI%=0
  297. 14100 XX=XX+INC%: NEXT H%: YY=YY-INC%: IF YY<-5399 THEN 14120
  298. 14110 NEXT V%
  299. 14120 PRINT #2,CHR$(12): IF FI%=1 THEN LDF=LOF(2): GOSUB 1180
  300. 14130 GOSUB 1020: X$=Q1$: GOSUB 5000: MTH=TH: MPH=PH: RETURN
  301. 14140 EE=ERR: RESUME 14150
  302. 14150 GOSUB 1110: IF A$="n" OR A$="N" THEN RETURN ELSE 14030
  303. 15000 'Azimut (QTF) and elevation (ZE)
  304. 15010 D=R*MPH: GOSUB 10000: ELEV=Z0
  305. 15020 TH=0: GOSUB 1010: A1=X1: A2=0: A3=X3: 'Observer's cartesian co-ordinates
  306. 15030 PH=PH+P2: GOSUB 1010: N1=X1: N2=0: N3=X3: 'Main versor to North
  307. 15040 PH=0: FOR I%=1 TO 3: TH=TH(I%)-MTH: GOSUB 1010: X=FNIP(A1,A2,A3,X1,X2,X3): GOSUB 1040: D=X*R: GOSUB 10000: ZE(I%)=Z0
  308. 15050 IF U%=1 THEN X=P2 ELSE GOSUB 6000: IF TH<0 THEN X=2*P-X
  309. 15060 QTF(I%)=X*RD: NEXT I%: CORR=QTF(2)-180: IF MPH<0 THEN CORR=-QTF(2): IF QTF(2)>180 THEN CORR=360-QTF(2)
  310. 15070 RETURN
  311.